package cn.bugstack.infrastructure.dcc;

import cn.bugstack.wrench.dynamic.config.center.types.annotations.DCCValue;
import cn.bugstack.types.common.Constants;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

/**
 * infrastructure 层真正的与数据库，中间件进行交互；被 domain 层通过 Repository仓储调用
 * 这里只是两个注解字段，值存储在redis中，所以放在这一层
 *
 * @description 动态配置服务
 */
@Service
public class DCCService {

    // 降级开关 0关闭、1开启
    @DCCValue("downgradeSwitch:0")
    private String downgradeSwitch;

    // 切量开关  100 表示允许全部用户访问
    @DCCValue("cutRange:100")
    private String cutRange;

    // sc值，黑名单值，匹配上的就拦截
    @DCCValue("scBlacklist:s02c02")
    private String scBlacklist;

    // 缓存开关
    @DCCValue("cacheSwitch:0")
    private String cacheOpenSwitch;

    public boolean isDowngradeSwitch() {
        return "1".equals(downgradeSwitch);
    }

    public boolean isCutRange(String userId) {
        // 计算哈希码的绝对值
        int hashCode = Math.abs(userId.hashCode());

        // 获取最后两位
        int lastTwoDigits = hashCode % 100;

        // 判断是否在切量范围内
        if (lastTwoDigits <= Integer.parseInt(cutRange)) {
            return true;
        }

        return false;
    }

    // 判断黑名单拦截渠道，true 拦截、false 放行
    public boolean isSCBlackIntercept(String source, String channel) {
        // sc值的黑名单，只要包含就拦截
        List<String> list = Arrays.asList(scBlacklist.split(Constants.SPLIT));
        return list.contains(source + channel);
    }

    // 缓存开启开关，0 true为开启，1 false为关闭
    public boolean isCacheOpenSwitch(){
        return "0".equals(cacheOpenSwitch);
    }

}
